#include "stm32f10x.h"                  // Device header

void IC_Init(void)
{
	/*开启时钟*/
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);			//开启TIM2的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);			//开启GPIOA的时钟
	
	/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;				//GPIO是输入了，所以选择上拉输入
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;					//GPIO_Pin_6对应的TIM3的CH1
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);						//将PA0引脚初始化为上拉输入
	
	/*配置时钟源*/
	TIM_InternalClockConfig(TIM3);									//选择内部时钟
	
	/*时基单元初始化*/
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;		//时钟分频，选择不分频，此参数用于配置滤波器时钟，不影响时基单元功能，就是滤波器抖动干扰的频率，要在这个频率f内N个采样点全部是相同的频率，就证明抖动干扰消除了
	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;	//计数器模式，选择向上计数
	TIM_TimeBaseInitStruct.TIM_Period = 65535-1;					//计数周期，即ARR的值，就是重装的设定值，这里设定最大的，因为ARR计数不能越界
	TIM_TimeBaseInitStruct.TIM_Prescaler = 72-1;					//预分频器，即PSC的值，分频之后是 1MHz的标准频率，所以选择72分频
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;				//重复计数器，高级定时器才会用到
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);					//将结构体变量交给TIM_TimeBaseInit，TIM_TimeBaseInit配置TIM2的时基单元	
	
	/*输入捕获初始化*/
	TIM_ICInitTypeDef TIM_ICInitStruct;
	TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;					//输入捕获通道 TIM_Channel ，就是通道，选CH1
	TIM_ICInitStruct.TIM_ICFilter = 0xF;							//输入捕获Filt过滤器，0xF选择最大，过滤效果最好
	TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;		//输入捕获Polarity极性选择，选择上升沿触发
	TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;				//输入捕获Prescaler分频器的，TIM_ICPSC_DIV1就是不分频
	TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;	//输入捕获的是直接去，还是交叉，TIM_ICSelection_DirectTI直接，还有一个选择TIM_ICSelection_IndirectTI就是交叉，CH1的就可以去捕获器2
	TIM_ICInit(TIM3,&TIM_ICInitStruct);								//输入捕获Init配置
	
	/*选择触发源及从模式*/
	TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);						//触发源选择TI1FP1,看单词也看得出来TIM_SelectInputTrigger，选择触发器，
	TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);					//TIM_SelectSlaveMode就是从模式配置，TIM_SlaveMode_Reset复位，表示清零，即TI1产生上升沿时，会触发CNT归零
	
	/*TIM使能*/
	TIM_Cmd(TIM3, ENABLE);			//使能TIM3，定时器开始运行
}

/**
  * 函    数：获取输入捕获的频率
  * 参    数：无
  * 返 回 值：捕获得到的频率
  */
uint32_t IC_GetFreq(void)
{
	return 1000000 / (TIM_GetCapture1(TIM3) + 1);		//测周法得到频率fx = fc / N，这里不执行+1的操作也可
	//就是我们需要读取CCR里面的值进行计算，TIM_GetCapture1就能帮助我们读取CCR里面的值，因为我们设置的是标准频率是1000000，所以通过公式计算就可以得到频率
}
